/* * Copyright 2011 JBoss Inc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jbpm.formbuilder.client; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.jbpm.formapi.shared.api.FormRepresentation; import org.jbpm.formapi.shared.form.FormEncodingException; import org.jbpm.formapi.shared.form.FormEncodingFactory; import org.jbpm.formapi.shared.form.FormRepresentationDecoder; import org.jbpm.formbuilder.shared.task.TaskPropertyRef; import org.jbpm.formbuilder.shared.task.TaskRef; import com.google.gwt.json.client.JSONArray; import com.google.gwt.json.client.JSONObject; import com.google.gwt.json.client.JSONParser; import com.google.gwt.json.client.JSONValue; /** * */ public class JsonLoadInput { private FormRepresentation form; private TaskRef task; private String profile; private String _package; private String contextPath; private Map<String, Object> formData = new HashMap<String, Object>(); private JsonLoadInput() { } public FormRepresentation getForm() { return form; } public void setForm(FormRepresentation form) { this.form = form; } public TaskRef getTask() { return task; } public void setTask(TaskRef task) { this.task = task; } public String getProfile() { return profile; } public void setProfile(String profile) { this.profile = profile; } public String getPackage() { return _package; } public void setPackage(String _package) { this._package = _package; } public Map<String, Object> getFormData() { if (formData == null) { formData = new HashMap<String, Object>(); } return formData; } public void setFormData(Map<String, Object> formData) { this.formData = formData; } public void setContextPath(String contextPath) { this.contextPath = contextPath; } public String getContextPath() { return contextPath; } public static JsonLoadInput parse(String innerHTML) throws FormEncodingException { JSONValue json = JSONParser.parseStrict(innerHTML); JsonLoadInput input = null; if (json.isObject() != null) { input = new JsonLoadInput(); JSONObject jsonObj = json.isObject(); if (jsonObj.get("embedded") != null && jsonObj.get("embedded").isString() != null) { input.setProfile(jsonObj.get("embedded").isString().stringValue()); } JSONValue jsonPkg = jsonObj.get("packageName"); if (jsonPkg != null && jsonPkg.isString() != null) { input.setPackage(jsonPkg.isString().stringValue()); } JSONValue jsonCtx = jsonObj.get("contextPath"); if (jsonCtx != null && jsonCtx.isString() != null) { input.setContextPath(jsonCtx.isString().stringValue()); } if (jsonObj.get("task") != null && jsonObj.get("task").isObject() != null) { input.setTask(toTask(jsonObj.get("task").isObject())); } if (jsonObj.get("formData") != null && jsonObj.get("formData").isObject() != null) { input.setFormData(toFormData(jsonObj.get("formData").isObject())); } if (jsonObj.get("formjson") != null && jsonObj.get("formjson").isString() != null) { input.setForm(toForm(jsonObj.get("formjson").isString().stringValue())); } } return input; } private static Map<String, Object> toFormData(JSONObject json) { Map<String, Object> retval = new HashMap<String, Object>(); for (String key : json.keySet()) { JSONValue value = json.get(key); retval.put(key, asActualValue(value)); } return retval; } private static Object asActualValue(JSONValue value) { if (value.isArray() != null) { JSONArray arr = value.isArray(); List<Object> retval = new ArrayList<Object>(); for (int index = 0; index < arr.size(); index++) { JSONValue subValue = arr.get(index); retval.add(asActualValue(subValue)); } return retval; } else if (value.isBoolean() != null) { return String.valueOf(value.isBoolean().booleanValue()); } else if (value.isNull() != null) { return null; } else if (value.isNumber() != null) { return String.valueOf(value.isNumber().doubleValue()); } else if (value.isString() != null) { return value.isString().stringValue(); } else if (value.isObject() != null) { return toFormData(value.isObject()); } return null; } private static FormRepresentation toForm(String json) throws FormEncodingException { FormRepresentationDecoder decoder = FormEncodingFactory.getDecoder(); FormRepresentation form = decoder.decode(json); return form; } private static TaskRef toTask(JSONObject json) { TaskRef retval = null; if (json != null) { retval = new TaskRef(); retval.setInputs(getIOData(json.get("inputs").isArray())); retval.setOutputs(getIOData(json.get("outputs").isArray())); Map<String, String> metaData = new HashMap<String, String>(); JSONObject jsonMetaData = json.get("metaData") == null ? null : json.get("metaData").isObject(); if (jsonMetaData != null) { for (String key : jsonMetaData.keySet()) { metaData.put(key, jsonMetaData.get(key).isString().stringValue()); } } retval.setMetaData(metaData); if (json.get("packageName") != null && json.get("packageName").isString() != null) { retval.setPackageName(json.get("packageName").isString().stringValue()); } if (json.get("processId") != null && json.get("processId").isString() != null) { retval.setProcessId(json.get("processId").isString().stringValue()); } if (json.get("taskId") != null && json.get("taskId").isString() != null) { retval.setTaskId(json.get("taskId").isString().stringValue()); } } return retval; } private static List<TaskPropertyRef> getIOData(JSONArray jsonIO) { List<TaskPropertyRef> retval = new ArrayList<TaskPropertyRef>(); if (jsonIO != null) { for (int index = 0; index < jsonIO.size(); index++) { JSONObject jsonIo = jsonIO.get(index).isObject(); TaskPropertyRef io = new TaskPropertyRef(); if (jsonIo.get("name") != null && jsonIo.get("name").isString() != null) { io.setName(jsonIo.get("name").isString().stringValue()); } if (jsonIo.get("sourceExpression") != null && jsonIo.get("sourceExpression").isString() != null) { io.setSourceExpresion(jsonIo.get("sourceExpression").isString().stringValue()); } retval.add(io); } } return retval; } }